home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 26.zip / BS1 part 26 / The Director Toolkit v1.0.adf / Programs / SineTable / PieChart < prev    next >
Text File  |  1987-02-25  |  5KB  |  238 lines

  1.  
  2. rem  sine table example.  Uses sine table to do pie chart
  3. rem  routine.
  4.  
  5.     load 1,"ToolKit:pictures/blank.pic"
  6.     loadfont 1,8,"topaz.font"
  7.     setfont 1         :rem  insure topaz 8 for labeling
  8.  
  9. rem  these parameters can be adjusted dynamically if you like, or
  10. rem  you can set them to specific values and leave them
  11.     pxsize=80            :rem  chart x size
  12.     pysize=pxsize*9/10    :rem  chart y size
  13.     textclr=1        :rem  text color
  14.     bordclr=5        :rem  border color
  15.     startclr=4        :rem  first color
  16.     nolabels=0        :rem  set to 1 to inhibit text labeling
  17.  
  18. rem  *******array locations *************
  19.  
  20. rem  data pointers, make sure you have enough of these for your data
  21. rem  this represents the maximum number of slices allowable in the
  22. rem  piechart
  23.     data=0
  24.     dataa=10
  25.     datab=11
  26.     datac=12
  27.     datad=13
  28.     datae=14
  29.     dataf=15
  30.     datag=16
  31.     datah=17
  32.     lastdata=17
  33.  
  34.     labelsz=21        :rem  max label size=20 chars
  35.  
  36.     title=lastdata+1     :rem  array location of chart title
  37.     labela=title+labelsz :rem  array location of first label
  38.                          :rem  should be one of these for each data element
  39.     labelb=labela+labelsz
  40.     labelc=labelb+labelsz
  41.     labeld=labelc+labelsz
  42.     labele=labeld+labelsz
  43.     labelf=labele+labelsz
  44.     labelg=labelf+labelsz
  45.     labelh=labelg+labelsz
  46.     sines=labelh+labelsz        :rem  sine table array location
  47.     array sines+92,2            :rem  create the array
  48.  
  49.     gosub 5020       :rem  load in sine table
  50.  
  51. rem   ********* initialization done ***********
  52.  
  53. rem  initial center coordinate of a pie chart...
  54.     cx=160            
  55.     cy=100
  56.     string "COMPUTER SALES",$(title)
  57.  
  58. 5
  59. rem  setup the specific data and label for each slice for the chart
  60. rem  here's where you'd need to setup your data
  61.     elements=6        :rem  number of slices
  62.     string "I.B.M.",$(labela)
  63.     @(dataa)=?400      :rem  just use some random data for now.
  64.     string "Apollo",$(labelb)
  65.     @(datab)=?400
  66.     string "Amiga",$(labelc)
  67.     @(datac)=400       :rem make sure Amiga's always the biggest
  68.     string "Atari",$(labeld)
  69.     @(datad)=?200
  70.     string "MacIntosh",$(labele)
  71.     @(datae)=?400
  72.     string "Sun",$(labelf)
  73.     @(dataf)=?400
  74.  
  75.     gosub 10    :rem  draw the chart boxed and titled
  76.  
  77.  
  78. rem  move center point around the screen 
  79.     cx=640-cx
  80.     if cx=160
  81.         cy=400-cy
  82.         if cy=100
  83.             pause 50
  84.             clear
  85.         endif
  86.     endif
  87.     goto 5    :rem  do another chart at next location
  88.  
  89.  
  90.  
  91.  
  92. rem  ****** draw a chart ******
  93. 10    
  94. rem  draw a box around graph
  95.     pen 1,3
  96.     move cx-160,cy-100
  97.     draw cx+159,cy-100
  98.     draw cx+159,cy+99
  99.     draw cx-160,cy+99
  100.     draw cx-160,cy-100
  101.  
  102. rem  add title at top of graph
  103. rem  count characters in title
  104.     zzz=0
  105. 11  if @(title+zzz)
  106.         zzz=zzz+1
  107.         goto 11
  108.     endif
  109.     pen 1,1
  110.     move cx-zzz*4,cy-84    
  111.     text $(title)
  112.     gosub 5100        :rem  do the pie chart
  113.     return
  114.  
  115.  
  116. rem  *** pie chart routine ***
  117. 5100 
  118.     rxsize=10000/pxsize    :rem  reciprocals
  119.     rysize=10000/pysize
  120.  
  121.     pen 1,bordclr
  122.     offy=10
  123.     cy=cy+offy
  124.     ellipse cx,cy,pxsize,pysize
  125.  
  126. rem  compute 100% total
  127.     total=0
  128.     for ttt=0 to elements-1
  129.         total=total+@(dataa+ttt)
  130.     next
  131.  
  132. rem  draw and fill wedges
  133.     cl=startclr
  134.     degs=0
  135.     move cx,cy:draw cx,cy-pysize
  136.     for ttt=0 to elements-1
  137.         dist=(360*@(dataa+ttt)+total/2)/total
  138.         degs=degs+dist
  139.         deg=degs
  140.         gosub 5000        :rem  sin
  141.         gosub 5010        :rem  cos
  142.         move cx,cy
  143.         pen 1,bordclr
  144.         draw cx+sin/rxsize,cy-cos/rysize
  145.         deg=deg-dist/2
  146.         if dist>2        :rem  don't fill if too small
  147.             gosub 5000
  148.             gosub 5010
  149.             pen 1,cl
  150.             cl=cl+1
  151.             fill 1,cx+sin/(rxsize+5),cy-cos/(rysize+5)
  152.         endif
  153.     next
  154.  
  155.     if nolabels
  156.         return
  157.     endif
  158.  
  159. rem  now do labels
  160.     degs=0
  161.     for ttt=0 to elements-1
  162.         dist=(360*@(dataa+ttt)+total/2)/total
  163.         degs=degs+dist
  164.         deg=degs-dist/2
  165.         gosub 5000
  166.         gosub 5010
  167.  
  168. rem  count the characters in the label
  169.         label=labela+labelsz*ttt
  170.         zzz=0
  171. 5120    if @(label+zzz)
  172.             zzz=zzz+1
  173.             goto 5120
  174.         endif
  175.         drawmode 0
  176.         txtx=cx+sin/(9000/pxsize)-zzz*4
  177.         txty=cy-cos/(9000/pysize)
  178.         move txtx+2,txty+1
  179.         pen 1,0
  180.         text $(label)
  181.         move txtx,txty
  182.         pen 1,textclr
  183.         text $(label)
  184.         drawmode 1
  185.     next
  186.     cy=cy-offy
  187.     return
  188.  
  189.  
  190.  
  191. rem  ********** Integer trig routines **************
  192. rem  sin routine
  193. rem  set deg= degree, returns sin= sin*10000
  194.  
  195. 5000 sin=deg % 90
  196.     sina = (deg%360)/90
  197.     if sina=1 | sina=3
  198.         sin=90-sin
  199.     endif
  200.     sin=@(sines+sin)
  201.     if sina>1
  202.         sin = 0-sin
  203.     endif
  204.     return
  205.  
  206. rem  cos routine
  207. rem  set deg= degree, returns cos= cos*10000
  208.  
  209. 5010 cos=(deg+90) % 90
  210.     sina = ((deg+90)%360)/90
  211.     if sina=1 | sina=3
  212.         cos=90-cos
  213.     endif
  214.     cos=@(sines+cos)
  215.     if sina>1
  216.         cos = 0-cos
  217.     endif
  218.     return
  219.  
  220. rem  **** load in sine table ****
  221. 5020
  222. rem  open sine table file
  223.     v=0
  224.     open v,"sinetab"
  225.     if 0=v
  226.         print "can't find sinetab"
  227.         end
  228.     endif
  229.  
  230. rem  read in sine table
  231.     for i=0 to 90
  232.         read v,$(data),10
  233.         v = $(data)
  234.         @(sines+i)=v
  235.     next
  236.     return
  237.  
  238.